XIAO SenseでScratchから加速度をとってみ「ちゃお(XIAO)」
https://gyazo.com/c47549b8590b6dda8329e1f9768fd41f
はじめに
はじめに、今回のようなドロ沼にハマった経緯です。
そういや、Seeedの…買ってたなぁ…
なるべくコンパクトに!! -> nRF52840 Senseが本命!!
https://gyazo.com/c10d1bdaa10ce94fdcfa207ee8f866e2
Seeed Studio XIAO nRF52840 Senseってなぁに?
https://files.seeedstudio.com/wiki/XIAO-BLE/front-pinout-4.jpg
(c) Seeed
今回利用したSeeed Studio XIAO nRF52840 Sense(以下、XIAO nRF52840 Sense)の仕様は以下の通りです。
特に歩数計を作る上で重要な仕様は赤字で示します。
SoC: ARM® Cortex®-M4(Nordic nRF52840)@64MHz
低消費電力: 待機時5μA
無線: Bluetooth Low Energy 5.0 (アンテナちっちゃ!!)
I/O: UART x1, I2C x1, SPI x1, NFC x1, SWD x1, GPIO(PWM) x11, ADC x6
SenseはIMUとマイク付属
IMU: 6軸IMU LSM6DS3TR-C
PDMマイク
サイズ: とても小さい(20 x 17.5mm) , 2g だいたい一辺が1円玉の直径ぐらい
XIAO32bitLessってなぁに?
https://gyazo.com/f06912a785ae9e6a3548bd490a61dc74
今回、ScratchとSeeed Studio XIAO nRF52840 Senseをつなぐのに利用したXIAO32bitLessについて簡単に説明します。
これをM5Stackファミリーなどから使えるようにしたもの。
今回のプロジェクトに必要な機能
歩数計用に加速度計(IMU)
Scratchとの通信にBLE
-> 使える機種
XIAO ESP32C3 + IMU
XIAO nRF52840 Sense
ハマりどころ
XIAO nRF52840 Senseを使うにあたって、以下のようなドロ沼にハマりました(詳細は後述)。
Bluetooth Low Energy(BLE)に関する問題
BLEライブラリどれ使えばいいのか問題
Bluefruit LEライブラリでreadされた時の処理をどうするのか問題
肝心のreTerminalとXIAO nRF52840 Senseがつながらない問題
XIAO nRF52840 Sense内蔵IMUをどう使うか問題
Arduino IDE 2のAuto formatが変問題
BLEライブラリどれ使えばいいのか問題
nRF52840のBLEライブラリは色々な種類があってどれを選ぶのかで問題がありました。
ESP32やSAMDでは、BLEまわりはほとんどコード変更なくすんなり動いた。
ESP32: XIAO ESP32C3 (ESP32ボードの標準のBLEライブラリ:以下ESP32 BLE)
SAMD: Wio Terminal (Seeed_Arduino_rpcBLE: ESP32 BLEコンパチ)
さて、XIAO nRF52840 Sense(nRF52840)の場合…
BLEスタックの種類が多く、対応しているボードとの組み合わせも複雑。
"Seeed nRF52 Boards"用
"Seeed nRF52 mbed-enabled Boards"用
少し古いnRF8001とnR51822でペリフェラルを作るためのライブラリ
対応の手間を考えると、ESP32 BLEとほぼコンパチのNimBLEが使いたかった。
とりあえず、BLEスタックを取っ替え引っ替えして実装してみた。
Bluefruit LE: 最終的に動いた。
ArduinoBLE: 接続できるところぐらいまでは動いた。
NimBLE: なんとなく動いてるんだけど、アドバタイズさえひろえないorz
最低限のスケッチ例で試してもダメだったので、やっぱりあかんのか?
https://gyazo.com/e5e77f02b63fb17c98ddd3439aa6eded
9自由度IMU = LSM6DS33 加速度、ジャイロ + LIS3MDL 地磁気センサー
APDS9960 近接、光、色、ジェスチャーセンサー
PDM マイク
SHT 湿度センサー
BMP280 温度、気圧センサー
LED: Red, Blue, Neopixel
Switch: Reset用, User用
Bluefruit LEライブラリでreadされた時の処理をどうするのか問題
最初、Bluefruit LEライブラリで、BLEでペリフェラルがデータを読みこんだ時(read)に、セントラル側からどうやってデータを書きこんで渡す(write)のかがよくわかりませんでした。
Bluefruit LEでペリフェラル(Scratch)側でデータがreadされた時に、どうデータを処理するか?
ESP32 BLEだと、readコールバック関数があって、そこで処理できる。
Bluefruit LEにはそれっぽいsetReadAuthorizeCallback()がある。
このコールバックが呼ばれるとしばらくして接続が切れるorz
結局、データをセントラル側でwriteし続けていれば、ペリフェラル側で受け取れた。
肝心のreTerminalとXIAO nRF52840 Senseがつながらない問題
reTerminalとXIAO nRF52840 Senseの接続に関しても、問題がありました。
さあ動画を撮影しようと実際にreTerminalと接続しようとすると…
アドバタイズは見えてる。
接続しようとして失敗しているorz
XIAO nRF52840 Senseだけで起こる。
Adafruit Feather nRF52840 Senseは問題ない。
結局、アドバタイズからペアリングするまでの間に問題があるみたい。
reTerminal本体内蔵のBLEデバイスでは使えない。
USB BLEドングルをつけると、近づけばつながるようになった…
つながった後は、離れても問題ない。
XIAO nRF52840 Sense内蔵IMUをどう使うか問題
XIAO nRF52840 Sense内蔵IMUの利用もすんなりとはいきませんでした。
IMUライブラリは、公式ページによると、Seeed nRF52 mbed-enabled Boardで使った方が良いということになっているorz なんか、mbed版、2.7.2でも2.6.1でもコンパイルすらできないんですが…
code:err.ino
Error resolving FQBN: getting build properties for board Seeeduino:mbed:xiaonRF52840Sense: invalid option 'softdevice'
Compilation error: Error resolving FQBN: getting build properties for board Seeeduino:mbed:xiaonRF52840Sense: invalid option 'softdevice'
結論としては、Arduino IDE 2ではダメで、Arduino IDE 1.8系列を使えば良い…
外に出ているI2C(Wire)とは別に内蔵I2C(Wire1)がある。
内蔵I2Cに内蔵IMU(LSM6DS3)はつながっている。
なんか、 #define Wire Wire1してるけど、うまく動いてないので、LSM6DS3.cppを直接書き換える必要がある。
Arduino IDE 2のAuto format問題
Arduino IDEのAuto formatは.clang-formatというファイルで制御できるのですが、デフォルトの設定でおかしくなる場合がありました。
プリプロセッサ用の#ifとか#elseとか#endifとかが多いと変になる。
関数とクラスを切り分けるとダメな気がする。
この変なインデントのせいで、元のソースコードだけよりdiffの方が大きくなるorz
以下の例では、関数b()とc()呼び出し部分でインデントがおかしくなっています。
code:変なインデント.ino
int A() {
class C : public D {
void A() {
void B() {
b();
c();
}
}
めちゃくちゃ調整できることが多いorz
まだ手つかず…
おわりに
https://gyazo.com/e3c22e6f22165730fe6653a3ca73cf92
Seeed Studio XIAO nRF52840 Senseへの対応は、最初予想していたより、手強かった。
特にBLEまわりはドロ沼の闇ですorz
でも、最終的に動いたので、ハッピー!!
参考になるもの
ググっても情報ありません (forumがクローラー避けしてるっぽい)
IoT縛りの勉強会! IoTLT vol.94 (忘年会IoTLTラジオ)でのコメント
以下のようなコメントをいただきました!!(1:10:50-1:18:24)
https://www.youtube.com/watch?v=DvDkIQO0Lu8&t=4250s